plot_fort_maps2 <- function(data, fill_str, legend_title, plot_title, size=0.1){
require(ggplot2)
require(ggsn)
require(broom)
ggplot() + # initialize ggplot object
geom_polygon( # make a polygon
data = data, # data frame
aes_string(x = "long", y = "lat", group = "group", # coordinates, and group them by polygons
fill = fill_str),
size=size, color="black") + # variable to use for filling
scale_fill_brewer(name=legend_title, palette = "RdYlBu", direction = -1,
drop = FALSE) + # fill with brewer colors # add title
theme(line = element_blank(),
axis.text=element_blank(), # .. tickmarks..
axis.title=element_blank(),
legend.position="none",
plot.margin = unit(c(0, 0, 0, 0), "cm"),
#legend.text=element_text(size=15),
#legend.title=element_text(size=17), # .. axis labels..
panel.background = element_blank(), plot.title = element_text(size=5)) + ggtitle(plot_title)
}
shape_to_ggplot <- function(shape){
require(broom)
gg_data <- tidy(shape)
data <- slot(shape, "data")
shape[["polyID"]] <- sapply(slot(shape, "polygons"), function(x) slot(x, "ID"))
gg_data <- merge(gg_data, shape, by.x="id", by.y="polyID")
return(gg_data)
}
grid_
Error: object 'grid_' not found
library(readr)
library(dplyr)
library(stringi)
library(rgdal)
CT_shp <- readOGR("~/Documents/Harvard - SM80/Thesis/Census_data/CE_setores_censitarios_shape/", "Corrected_CTs", use_iconv = TRUE, encoding = "latin1")
OGR data source with driver: ESRI Shapefile
Source: "/Users/Sudipta/Documents/Harvard - SM80/Thesis/Census_data/CE_setores_censitarios_shape", layer: "Corrected_CTs"
with 3044 features
It has 13 fields
library(spdep)
package ‘spdep’ was built under R version 3.4.4Loading required package: Matrix
Loading required package: spData
package ‘spData’ was built under R version 3.4.4To access larger datasets in this package, install the spDataLarge package with:
`install.packages('spDataLarge', repos='https://nowosad.github.io/drat/', type='source'))`
library(dplyr)
CT_shp@data$CD_GEOCODI <- as.character(CT_shp@data$CD_GEOCODI)
CT_shp@data <- arrange(CT_shp@data, CD_GEOCODI)
package ‘bindrcpp’ was built under R version 3.4.4
CT_wm <- poly2nb(CT_shp, snap=0.001)
library(INLA)
This is INLA_17.06.20 built 2017-06-20 03:44:36 UTC.
See www.r-inla.org/contact-us for how to get help.
nb2INLA("CT_graph.adj", CT_wm)
CT_adj <- "CT_graph.adj"
Census_covar <- read_csv("~/Documents/Harvard - SM80/Thesis/Fortaleza_Hom_RGit/Census_data/census_covariates_Fortaleza_01_03_19.csv")
Parsed with column specification:
cols(
.default = col_integer(),
Cod_setor = col_double(),
TIPO = col_character(),
CD_GEOCODB = col_double(),
NM_BAIRRO = col_character(),
Lit_rate = col_double(),
Mean_HH_inc = col_double(),
Perc_Wtr_Spply_Ntwrk = col_double(),
Perc_Sewerage_Conn = col_double(),
Perc_Garbage_Col_Serv = col_double(),
Perc_PPH_Elec = col_double(),
Perc_branca = col_double(),
Perc_preta = col_double(),
Perc_amarela = col_double(),
Perc_parda = col_double(),
Perc_indigena = col_double(),
ICE = col_double()
)
See spec(...) for full column specifications.
Census_covar[is.na(Census_covar$Mean_HH_inc),]$Mean_HH_inc <- 1
Census_covar[Census_covar$Mean_HH_inc==0,]$Mean_HH_inc <- 1
Census_covar$log_Mean_HH_inc <- log(Census_covar$Mean_HH_inc)
Census_covar$Cod_setor <- as.character(Census_covar$Cod_setor)
Census_covar$LII <- NA
for (i in 1:3044){
CT_Code <- CT_shp@data$CD_GEOCODI[i]
neighbors_codes <- CT_shp@data$CD_GEOCODI[CT_wm[[i]]]
total_nb_inc <- sum(Census_covar[(Census_covar$Cod_setor %in% neighbors_codes),]$Total_HH_inc_in_CT, na.rm = TRUE)
total_nb_hh <- sum(Census_covar[(Census_covar$Cod_setor %in% neighbors_codes),]$Total_no_HH_in_CT, na.rm = TRUE)
Mean_nb_inc <- total_nb_inc / total_nb_hh
LII <- Mean_nb_inc / Census_covar[(Census_covar$Cod_setor)==CT_Code,]$Mean_HH_inc
Census_covar[(Census_covar$Cod_setor==CT_Code),]$LII <- LII
}
Census_covar$LII[Census_covar$LII==Inf] <- NA
Census_covar$log_LII <- log(Census_covar$LII)
CT_shp_gg <- shape_to_ggplot(CT_shp)
Loading required package: broom
package ‘broom’ was built under R version 3.4.4Regions defined for each Polygons
breaks_inc <- quantile(Census_covar$log_Mean_HH_inc, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_lii <- quantile(Census_covar$LII, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_lit <- quantile(Census_covar$Lit_rate, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_log_lii <- quantile(Census_covar$log_LII, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_brnc <- quantile(Census_covar$Perc_branca, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_swrge <- quantile(Census_covar$Perc_Sewerage_Conn, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
breaks_ice <- quantile(Census_covar$ICE, probs=c(seq(0,1,0.15),1), na.rm = TRUE)
CT_shp_gg_covar <- CT_shp_gg[,-1] %>% left_join(Census_covar, by=c("CD_GEOCODI"="Cod_setor")) %>% mutate(cut_inc=cut(log_Mean_HH_inc, breaks=breaks_inc, include.lowest=TRUE), cut_lii=cut(LII, breaks=breaks_lii, include.lowest=TRUE), cut_brnc=cut(Perc_branca, breaks=breaks_brnc, include.lowest=TRUE), cut_swrge=cut(Perc_Sewerage_Conn, breaks=breaks_swrge, include.lowest=TRUE), cut_ice=cut(ICE, breaks=breaks_ice, include.lowest=TRUE), cut_log_lii=cut(log_LII, breaks=breaks_log_lii, include.lowest=TRUE), cut_lit=cut(Lit_rate, breaks=breaks_lit, include.lowest=TRUE))
plot_fort_maps2(CT_shp_gg_covar, "cut_inc","Log Mean HH Income", "Log Mean HH Income") + theme(plot.title = element_text(size=10), legend.position = "right") + scale_fill_brewer(name="Log Mean HH Income", palette = "RdYlBu", direction=1, drop = FALSE)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

plot_fort_maps2(CT_shp_gg_covar, "cut_log_lii","Log LII", "Log LII") + theme(plot.title = element_text(size=10), legend.position = "right")

plot_fort_maps2(CT_shp_gg_covar, "cut_lii","LII", "LII") + theme(plot.title = element_text(size=10), legend.position = "right")

plot_fort_maps2(CT_shp_gg_covar, "cut_lit","Literacy Rate", "Literacy Rate") + theme(plot.title = element_text(size=10), legend.position = "right") + scale_fill_brewer(name="Literacy Rate", palette = "RdYlBu", direction=1, drop = FALSE)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

plot_fort_maps2(CT_shp_gg_covar, "cut_brnc","Perc branca", "Perc branca") + theme(plot.title = element_text(size=10), legend.position = "right") + scale_fill_brewer(name="Perc branca", palette = "RdYlBu", direction=1, drop = FALSE)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

plot_fort_maps2(CT_shp_gg_covar, "cut_swrge","Perc Sewerage", "Perc Sewerage") + theme(plot.title = element_text(size=10), legend.position = "right") + scale_fill_brewer(name="Perc Sewerage", palette = "RdYlBu", direction=1, drop = FALSE)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

plot_fort_maps2(CT_shp_gg_covar, "cut_ice","ICE Index", "ICE Index") + theme(plot.title = element_text(size=10), legend.position = "right") + scale_fill_brewer(name="ICE Index", palette = "RdYlBu", direction=1, drop = FALSE)
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing
scale.

LS0tCnRpdGxlOiAiQ292YXJpYXRlIGRlc2NyaXB0aXZlIG1hcHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpwbG90X2ZvcnRfbWFwczIgPC0gZnVuY3Rpb24oZGF0YSwgZmlsbF9zdHIsIGxlZ2VuZF90aXRsZSwgcGxvdF90aXRsZSwgc2l6ZT0wLjEpewogIHJlcXVpcmUoZ2dwbG90MikKICByZXF1aXJlKGdnc24pCiAgcmVxdWlyZShicm9vbSkKICBnZ3Bsb3QoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluaXRpYWxpemUgZ2dwbG90IG9iamVjdAogICAgZ2VvbV9wb2x5Z29uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWFrZSBhIHBvbHlnb24KICAgICAgZGF0YSA9IGRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkYXRhIGZyYW1lCiAgICAgIGFlc19zdHJpbmcoeCA9ICJsb25nIiwgeSA9ICJsYXQiLCBncm91cCA9ICJncm91cCIsICAgICAgICAgICAgICAgICMgY29vcmRpbmF0ZXMsIGFuZCBncm91cCB0aGVtIGJ5IHBvbHlnb25zCiAgICAgICAgICAgICAgICAgZmlsbCA9IGZpbGxfc3RyKSwKICAgICAgc2l6ZT1zaXplLCBjb2xvcj0iYmxhY2siKSArICAgICAgICAgICAgICAgICMgdmFyaWFibGUgdG8gdXNlIGZvciBmaWxsaW5nCiAgICBzY2FsZV9maWxsX2JyZXdlcihuYW1lPWxlZ2VuZF90aXRsZSwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgICAgIGRyb3AgPSBGQUxTRSkgKyAjIGZpbGwgd2l0aCBicmV3ZXIgY29sb3JzICAgIyBhZGQgdGl0bGUKICAgIHRoZW1lKGxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF9ibGFuaygpLCAgICAgICMgLi4gdGlja21hcmtzLi4KICAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsIDAsIDAsIDApLCAiY20iKSwKICAgICAgICAgICNsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSksCiAgICAgICAgICAjbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE3KSwgIyAuLiBheGlzIGxhYmVscy4uCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ2d0aXRsZShwbG90X3RpdGxlKQp9CgoKCnNoYXBlX3RvX2dncGxvdCA8LSBmdW5jdGlvbihzaGFwZSl7CiAgcmVxdWlyZShicm9vbSkKICBnZ19kYXRhIDwtIHRpZHkoc2hhcGUpCiAgZGF0YSA8LSBzbG90KHNoYXBlLCAiZGF0YSIpCiAgc2hhcGVbWyJwb2x5SUQiXV0gPC0gc2FwcGx5KHNsb3Qoc2hhcGUsICJwb2x5Z29ucyIpLCBmdW5jdGlvbih4KSBzbG90KHgsICJJRCIpKQogIGdnX2RhdGEgPC0gbWVyZ2UoZ2dfZGF0YSwgc2hhcGUsIGJ5Lng9ImlkIiwgYnkueT0icG9seUlEIikKICByZXR1cm4oZ2dfZGF0YSkKfQpgYGAKCgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KHJnZGFsKQpDVF9zaHAgPC0gcmVhZE9HUigifi9Eb2N1bWVudHMvSGFydmFyZCAtIFNNODAvVGhlc2lzL0NlbnN1c19kYXRhL0NFX3NldG9yZXNfY2Vuc2l0YXJpb3Nfc2hhcGUvIiwgIkNvcnJlY3RlZF9DVHMiLCB1c2VfaWNvbnYgPSBUUlVFLCBlbmNvZGluZyA9ICJsYXRpbjEiKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHNwZGVwKQpsaWJyYXJ5KGRwbHlyKQpDVF9zaHBAZGF0YSRDRF9HRU9DT0RJIDwtIGFzLmNoYXJhY3RlcihDVF9zaHBAZGF0YSRDRF9HRU9DT0RJKQpDVF9zaHBAZGF0YSA8LSBhcnJhbmdlKENUX3NocEBkYXRhLCBDRF9HRU9DT0RJKQpDVF93bSA8LSBwb2x5Mm5iKENUX3NocCwgc25hcD0wLjAwMSkKYGBgCgpgYGB7cn0KbGlicmFyeShJTkxBKQpuYjJJTkxBKCJDVF9ncmFwaC5hZGoiLCBDVF93bSkKQ1RfYWRqIDwtICJDVF9ncmFwaC5hZGoiCmBgYAoKYGBge3J9CkNlbnN1c19jb3ZhciA8LSByZWFkX2Nzdigifi9Eb2N1bWVudHMvSGFydmFyZCAtIFNNODAvVGhlc2lzL0ZvcnRhbGV6YV9Ib21fUkdpdC9DZW5zdXNfZGF0YS9jZW5zdXNfY292YXJpYXRlc19Gb3J0YWxlemFfMDFfMDNfMTkuY3N2IikKCkNlbnN1c19jb3Zhcltpcy5uYShDZW5zdXNfY292YXIkTWVhbl9ISF9pbmMpLF0kTWVhbl9ISF9pbmMgPC0gMQpDZW5zdXNfY292YXJbQ2Vuc3VzX2NvdmFyJE1lYW5fSEhfaW5jPT0wLF0kTWVhbl9ISF9pbmMgPC0gMQpDZW5zdXNfY292YXIkbG9nX01lYW5fSEhfaW5jIDwtIGxvZyhDZW5zdXNfY292YXIkTWVhbl9ISF9pbmMpCkNlbnN1c19jb3ZhciRDb2Rfc2V0b3IgPC0gYXMuY2hhcmFjdGVyKENlbnN1c19jb3ZhciRDb2Rfc2V0b3IpCgpDZW5zdXNfY292YXIkTElJIDwtIE5BCgpmb3IgKGkgaW4gMTozMDQ0KXsKICBDVF9Db2RlIDwtIENUX3NocEBkYXRhJENEX0dFT0NPRElbaV0KICBuZWlnaGJvcnNfY29kZXMgPC0gQ1Rfc2hwQGRhdGEkQ0RfR0VPQ09ESVtDVF93bVtbaV1dXQogIHRvdGFsX25iX2luYyA8LSBzdW0oQ2Vuc3VzX2NvdmFyWyhDZW5zdXNfY292YXIkQ29kX3NldG9yICVpbiUgbmVpZ2hib3JzX2NvZGVzKSxdJFRvdGFsX0hIX2luY19pbl9DVCwgbmEucm0gPSBUUlVFKQogIHRvdGFsX25iX2hoIDwtIHN1bShDZW5zdXNfY292YXJbKENlbnN1c19jb3ZhciRDb2Rfc2V0b3IgJWluJSBuZWlnaGJvcnNfY29kZXMpLF0kVG90YWxfbm9fSEhfaW5fQ1QsIG5hLnJtID0gVFJVRSkKICBNZWFuX25iX2luYyA8LSB0b3RhbF9uYl9pbmMgLyB0b3RhbF9uYl9oaAogIExJSSA8LSBNZWFuX25iX2luYyAvIENlbnN1c19jb3ZhclsoQ2Vuc3VzX2NvdmFyJENvZF9zZXRvcik9PUNUX0NvZGUsXSRNZWFuX0hIX2luYwogIENlbnN1c19jb3ZhclsoQ2Vuc3VzX2NvdmFyJENvZF9zZXRvcj09Q1RfQ29kZSksXSRMSUkgPC0gTElJCn0KCkNlbnN1c19jb3ZhciRMSUlbQ2Vuc3VzX2NvdmFyJExJST09SW5mXSA8LSBOQSAKQ2Vuc3VzX2NvdmFyJGxvZ19MSUkgPC0gbG9nKENlbnN1c19jb3ZhciRMSUkpCmBgYApgYGB7cn0KQ1Rfc2hwX2dnIDwtIHNoYXBlX3RvX2dncGxvdChDVF9zaHApCmBgYAoKYGBge3J9CmJyZWFrc19pbmMgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJGxvZ19NZWFuX0hIX2luYywgcHJvYnM9YyhzZXEoMCwxLDAuMTUpLDEpLCBuYS5ybSA9IFRSVUUpCmJyZWFrc19saWkgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJExJSSwgcHJvYnM9YyhzZXEoMCwxLDAuMTUpLDEpLCBuYS5ybSA9IFRSVUUpCmJyZWFrc19saXQgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJExpdF9yYXRlLCBwcm9icz1jKHNlcSgwLDEsMC4xNSksMSksIG5hLnJtID0gVFJVRSkKYnJlYWtzX2xvZ19saWkgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJGxvZ19MSUksIHByb2JzPWMoc2VxKDAsMSwwLjE1KSwxKSwgbmEucm0gPSBUUlVFKQpicmVha3NfYnJuYyA8LSBxdWFudGlsZShDZW5zdXNfY292YXIkUGVyY19icmFuY2EsIHByb2JzPWMoc2VxKDAsMSwwLjE1KSwxKSwgbmEucm0gPSBUUlVFKQpicmVha3Nfc3dyZ2UgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJFBlcmNfU2V3ZXJhZ2VfQ29ubiwgcHJvYnM9YyhzZXEoMCwxLDAuMTUpLDEpLCBuYS5ybSA9IFRSVUUpCmJyZWFrc19pY2UgPC0gcXVhbnRpbGUoQ2Vuc3VzX2NvdmFyJElDRSwgcHJvYnM9YyhzZXEoMCwxLDAuMTUpLDEpLCBuYS5ybSA9IFRSVUUpCgpDVF9zaHBfZ2dfY292YXIgPC0gQ1Rfc2hwX2dnWywtMV0gJT4lIGxlZnRfam9pbihDZW5zdXNfY292YXIsIGJ5PWMoIkNEX0dFT0NPREkiPSJDb2Rfc2V0b3IiKSkgJT4lIG11dGF0ZShjdXRfaW5jPWN1dChsb2dfTWVhbl9ISF9pbmMsIGJyZWFrcz1icmVha3NfaW5jLCBpbmNsdWRlLmxvd2VzdD1UUlVFKSwgY3V0X2xpaT1jdXQoTElJLCBicmVha3M9YnJlYWtzX2xpaSwgaW5jbHVkZS5sb3dlc3Q9VFJVRSksIGN1dF9icm5jPWN1dChQZXJjX2JyYW5jYSwgYnJlYWtzPWJyZWFrc19icm5jLCBpbmNsdWRlLmxvd2VzdD1UUlVFKSwgY3V0X3N3cmdlPWN1dChQZXJjX1Nld2VyYWdlX0Nvbm4sIGJyZWFrcz1icmVha3Nfc3dyZ2UsIGluY2x1ZGUubG93ZXN0PVRSVUUpLCBjdXRfaWNlPWN1dChJQ0UsIGJyZWFrcz1icmVha3NfaWNlLCBpbmNsdWRlLmxvd2VzdD1UUlVFKSwgY3V0X2xvZ19saWk9Y3V0KGxvZ19MSUksIGJyZWFrcz1icmVha3NfbG9nX2xpaSwgaW5jbHVkZS5sb3dlc3Q9VFJVRSksIGN1dF9saXQ9Y3V0KExpdF9yYXRlLCBicmVha3M9YnJlYWtzX2xpdCwgaW5jbHVkZS5sb3dlc3Q9VFJVRSkpCgpgYGAKCmBgYHtyfQpwbG90X2ZvcnRfbWFwczIoQ1Rfc2hwX2dnX2NvdmFyLCAiY3V0X2luYyIsIkxvZyBNZWFuIEhIIEluY29tZSIsICJMb2cgTWVhbiBISCBJbmNvbWUiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iTG9nIE1lYW4gSEggSW5jb21lIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBkaXJlY3Rpb249MSwgZHJvcCA9IEZBTFNFKQoKcGxvdF9mb3J0X21hcHMyKENUX3NocF9nZ19jb3ZhciwgImN1dF9sb2dfbGlpIiwiTG9nIExJSSIsICJMb2cgTElJIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTApLCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSAKCnBsb3RfZm9ydF9tYXBzMihDVF9zaHBfZ2dfY292YXIsICJjdXRfbGlpIiwiTElJIiwgIkxJSSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgCgpwbG90X2ZvcnRfbWFwczIoQ1Rfc2hwX2dnX2NvdmFyLCAiY3V0X2xpdCIsIkxpdGVyYWN5IFJhdGUiLCAiTGl0ZXJhY3kgUmF0ZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKyBzY2FsZV9maWxsX2JyZXdlcihuYW1lPSJMaXRlcmFjeSBSYXRlIiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBkaXJlY3Rpb249MSwgZHJvcCA9IEZBTFNFKQoKcGxvdF9mb3J0X21hcHMyKENUX3NocF9nZ19jb3ZhciwgImN1dF9icm5jIiwiUGVyYyBicmFuY2EiLCAiUGVyYyBicmFuY2EiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iUGVyYyBicmFuY2EiLCBwYWxldHRlID0gIlJkWWxCdSIsIGRpcmVjdGlvbj0xLCBkcm9wID0gRkFMU0UpCgpwbG90X2ZvcnRfbWFwczIoQ1Rfc2hwX2dnX2NvdmFyLCAiY3V0X3N3cmdlIiwiUGVyYyBTZXdlcmFnZSIsICJQZXJjIFNld2VyYWdlIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTApLCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWU9IlBlcmMgU2V3ZXJhZ2UiLCBwYWxldHRlID0gIlJkWWxCdSIsIGRpcmVjdGlvbj0xLCBkcm9wID0gRkFMU0UpCgpwbG90X2ZvcnRfbWFwczIoQ1Rfc2hwX2dnX2NvdmFyLCAiY3V0X2ljZSIsIklDRSBJbmRleCIsICJJQ0UgSW5kZXgiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iSUNFIEluZGV4IiwgcGFsZXR0ZSA9ICJSZFlsQnUiLCBkaXJlY3Rpb249MSwgZHJvcCA9IEZBTFNFKQoKYGBgCgpgYGB7cn0KCmBgYAoK